package demo10;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        //1、创建一个实现接口的类的对象
        InfoImpl imp = new InfoImpl();
        //2、获取这个对象的字节码文件
        Class<? extends InfoImpl> impClass = imp.getClass();
        //3、获取字节码文件下的每一个方法
        Method[] declaredMethods = impClass.getDeclaredMethods();
        //3、打印每个方法的方法名 + 返回值类型名
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName() + ":" + declaredMethod.getReturnType().getSimpleName());
        }

    }

    public static void main3(String[] args) {
        //注意：用反射去获取对象的成员
        //二、获取成员方法
        //1、创建泛型对象
        Erasure<Integer> intErasure = new Erasure<>();
        //2、获取该对象的.class文件
        Class<? extends Erasure> intClass = intErasure.getClass();
        //3、获取该.class文件下的全部方法
        Method[] declaredMethods = intClass.getDeclaredMethods();
        //4、打印每一个方法名+返回值类型
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName() + ":" + declaredMethod.getReturnType().getSimpleName());
        }

    }

    public static void main2(String[] args) {
        //注意：用反射去获取对象的成员
        //一、获取成员变量
        //1、创建泛型类对象
        Erasure<Integer> intErasure = new Erasure<>();
        //2、通过泛型类对象获取泛型类对象的.class文件
        Class<? extends Erasure> intClass = intErasure.getClass();

        //3、通过.class文件获取成员变量
        Field[] declaredFields = intClass.getDeclaredFields();

        for (Field declaredField : declaredFields) {
            //4、打印成员变量名 + 成员变量类型
            System.out.println(declaredField.getName() +  ":" + declaredField.getType().getSimpleName());
        }
    }

    public static void main1(String[] args) {
        //发生类型擦除证明1：String和Integer都被擦除
        ArrayList<String> strArrayList = new ArrayList<>();
        ArrayList<Integer> intArrayList = new ArrayList<>();

        System.out.println(strArrayList.getClass().getSimpleName());
        System.out.println(intArrayList.getClass().getSimpleName());

        //发生类型擦除证明2：发生类型擦除，所以两个对象的.class文件是同一个
        System.out.println(strArrayList.getClass() == intArrayList.getClass());

    }
}
